//
// Created by Crestimes on 2024/11/18.
//

#ifndef REMANAGER_H
#define REMANAGER_H

#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;

inline set<char> oprSet = {'+', '?', '*', '|', '&'}; // 运算符

class ReManager {
public:
    explicit ReManager(const vector<string>& buffs);
    map<string, string> reMap; // 正则名到正则值的映射
    set<string> reOfTokenType; // 所有token类型对应的正则名
    set<string> reForAuxiliary; // 会出现在reOfTokenType的正则值中的正则名
    static bool isOpr(char ch);

private:
    void initReMap();
    static int findWithoutEscape(const string& str, char target, int pos = 0);
    string formatRe(string reValue);
    vector<string> buffs;
    string concatRe; // 所有需要生成DFA的正则表达式全部|起来形成的正则表达式，用于判断token是否是满足其中一个正则表达式，在最后对真实的代码段进行词法分析并分词时有用
};


#endif //REMANAGER_H
